/**
 * case class样例类是Scala中特殊的类。当声明样例类时，以下事情会自动发生：
 * 主构造函数接收的参数通常不需要显式使用var或val修饰，Scala会自动使用val修饰
 * 自动为样例类定义了伴生对象，并提供apply方法，不用new关键字就能够构造出相应的对象
 * 将生成toString、equals、hashCode和copy方法，除非显示的给出这些方法的定义
 * 继承了Product和Serializable这两个特质，也就是说样例类可序列化和可应用Product的方法
 * case class是多例的，后面要跟构造参数，case object是单例的。
 * 此外，case class样例类中可以添加方法和字段，并且可用于模式匹配
 *
 * @param username  姓名
 * @param location  位置
 * @param startTime 开始时间
 * @param duration  停留时长
 */
case class homework3(username: String, location: String, startTime: Int, duration: Int)

object UserLocation extends App {

  // 将数据封装到样例类中，初始化数据到集合
  val homework3Lst: List[homework3] = List(
    homework3("userA", "locationA", 8, 60),
    homework3("userA", "locationA", 9, 60),
    homework3("userB", "locationB", 11, 80),
    homework3("userB", "locationB", 10, 60)
  )

  // 分组，key为姓名加位置，确定唯一，算子为groupBy
  val grouphomework3: Map[String, List[homework3]] = homework3Lst.groupBy(user => user.username + "-" + user.location)
  println("分组")
  grouphomework3.foreach {
    case (k, v) => println(s"key:$k, value:$v")
  }

  // 排序，根据开始时间顺序,算子为mapValues
  val sorthomework3: Map[String, List[homework3]] = grouphomework3.mapValues(_.sortBy(_.startTime))
  println("排序")
  sorthomework3.foreach {
    case (k, v) => println(s"key:$k, value:$v")
  }


  // 统计,算子为mapValues，最终计算出不同组里的连续的开始时间的最终停留时长，原始数据不存在不连续，不考虑不连续
  var firstTime = 0
  val sumhomework3: Map[String, Int] = sorthomework3.mapValues(lst => {
    // 返回开始时间
    firstTime = lst.head.startTime
    // 返回总停留时长
    lst.map(_.duration).sum
  })
  println("最终")
  // 输出最终结果
  sumhomework3.foreach {
    case (k, v) => println(s"key:$k, 开始时间：$firstTime, value:$v")
  }

}
